<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="zj23x" id="zj23x"><span data-lake-id="u9d378e6f" id="u9d378e6f">典型回答</span></h1>
  <p data-lake-id="ubc050006" id="ubc050006"><br></p>
  <p data-lake-id="u0c9b9f31" id="u0c9b9f31"><span data-lake-id="u9345c7d6" id="u9345c7d6">下面是一次explain返回的一条SQL语句的执行计划的内容：</span></p>
  <p data-lake-id="u2ad8caeb" id="u2ad8caeb"><br></p>
  <pre lang="java"><code>
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+--------------------------+                                           
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra                    |                                           
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+--------------------------+                                           
|  1 | SIMPLE      | t2    | NULL       | index | NULL          | idx_abc | 198     | NULL |    5 |    20.00 | Using where; Using index |                                           
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+--------------------------+ 
</code></pre>
  <p data-lake-id="u08491b44" id="u08491b44"><span data-lake-id="u2f6a19fb" id="u2f6a19fb">​</span><br></p>
  <p data-lake-id="u8e7026e4" id="u8e7026e4"><span data-lake-id="u4cac495a" id="u4cac495a">一个执行计划中，共有12个字段，每个字段都挺重要的，先来介绍下这12个字段</span></p>
  <p data-lake-id="ua05b87c9" id="ua05b87c9"><span data-lake-id="u2f045d58" id="u2f045d58">​</span><br></p>
  <ol list="uc2e23369">
   <li fid="uc116a5b7" data-lake-id="u98a233e9" id="u98a233e9"><span data-lake-id="u684122a2" id="u684122a2">id：执行计划中每个操作的唯一标识符。对于一条查询语句，每个操作都有一个唯一的id。但是在多表join的时候，一次explain中的多条记录的id是相同的。</span></li>
   <li fid="uc116a5b7" data-lake-id="ub7451ab6" id="ub7451ab6"><span data-lake-id="ufe3d7014" id="ufe3d7014">select_type：操作的类型。常见的类型包括SIMPLE、PRIMARY、SUBQUERY、UNION等。不同类型的操作会影响查询的执行效率。</span></li>
   <li fid="uc116a5b7" data-lake-id="u2d50213d" id="u2d50213d"><span data-lake-id="u8c347152" id="u8c347152">table：当前操作所涉及的表。</span></li>
   <li fid="uc116a5b7" data-lake-id="u2a28b96b" id="u2a28b96b"><span data-lake-id="u704fc73b" id="u704fc73b">partitions：当前操作所涉及的分区。</span></li>
   <li fid="uc116a5b7" data-lake-id="u9ac322cf" id="u9ac322cf"><strong><span data-lake-id="u2686a137" id="u2686a137">type：表示查询时所使用的索引类型，包括ALL、index、range、ref、eq_ref、const等。</span></strong></li>
   <li fid="uc116a5b7" data-lake-id="u9ef3c9cb" id="u9ef3c9cb"><strong><span data-lake-id="ub1f65f79" id="ub1f65f79">possible_keys：表示可能被查询优化器选择使用的索引。</span></strong></li>
   <li fid="uc116a5b7" data-lake-id="u6ff6ed45" id="u6ff6ed45"><strong><span data-lake-id="ufbc4af76" id="ufbc4af76">key：表示查询优化器选择使用的索引。</span></strong></li>
   <li fid="uc116a5b7" data-lake-id="u70c1ac8d" id="u70c1ac8d"><span data-lake-id="ud73a1bc8" id="ud73a1bc8">key_len：表示索引的长度。索引的长度越短，查询时的效率越高。</span></li>
   <li fid="uc116a5b7" data-lake-id="u1d71f74c" id="u1d71f74c"><span data-lake-id="ub4e3b22a" id="ub4e3b22a">ref：用来表示哪些列或常量被用来与key列中命名的索引进行比较。</span></li>
   <li fid="uc116a5b7" data-lake-id="u78194415" id="u78194415"><span data-lake-id="u2921ca02" id="u2921ca02">rows：表示此操作需要扫描的行数，即扫描表中多少行才能得到结果。</span></li>
   <li fid="uc116a5b7" data-lake-id="u5d1d5c29" id="u5d1d5c29"><span data-lake-id="u4b51e8d4" id="u4b51e8d4">filtered：表示此操作过滤掉的行数占扫描行数的百分比。该值越大，表示查询结果越准确。</span></li>
   <li fid="uc116a5b7" data-lake-id="u64a42717" id="u64a42717"><strong><span data-lake-id="u1cc95f6b" id="u1cc95f6b">Extra：表示其他额外的信息，包括Using index、Using filesort、Using temporary等。</span></strong></li>
  </ol>
  <p data-lake-id="ud3a0e674" id="ud3a0e674"><span data-lake-id="ub9b8a8b4" id="ub9b8a8b4">​</span><br></p>
  <p data-lake-id="u1efda5f2" id="u1efda5f2"><span data-lake-id="u9ffaa5a8" id="u9ffaa5a8">假如我们有如下一张表（MySQL Innodb 5.7）：</span></p>
  <p data-lake-id="ucb53f454" id="ucb53f454"><span data-lake-id="ue377bf36" id="ue377bf36">​</span><br></p>
  <pre lang="java"><code>
 CREATE TABLE `t2` (          
  `id` INT(11),
  `a` varchar(64) NOT NULL,                                                                                                                                                          
  `b` varchar(64) NOT NULL,                                                                                                                                                          
  `c` varchar(64) NOT NULL,                                                                                                                                                          
  `d` varchar(64) NOT NULL,                                                                                                                                                          
  `f` varchar(64) DEFAULT NULL,    
  PRIMARY KEY(id),
  UNIQUE KEY `f` (`f`),                                                                                                                                                              
  KEY `idx_abc` (`a`,`b`,`c`)                                                                                                                                                       
) ENGINE=InnoDB DEFAULT CHARSET=latin1
</code></pre>
  <p data-lake-id="uf26db29c" id="uf26db29c"><span data-lake-id="uffe7e7f0" id="uffe7e7f0">​</span><br></p>
  <p data-lake-id="ufa4f1585" id="ufa4f1585"><span data-lake-id="u03cfcdfb" id="u03cfcdfb">挑其中比较重要的几个字段分别介绍下他们的不同值都有哪些区别：</span></p>
  <p data-lake-id="u0c01f25b" id="u0c01f25b"><span data-lake-id="uba549736" id="uba549736">​</span><br></p>
  <p data-lake-id="u68da8293" id="u68da8293"><span data-lake-id="ub2ad62b0" id="ub2ad62b0">首先说</span><strong><span data-lake-id="ubb5d163f" id="ubb5d163f">type</span></strong><span data-lake-id="u84579644" id="u84579644">，他有以下几个取值内容，并给出了具体的SQL（PS：以下SQL是我实际测试过的，但是具体的表内容不一样可能最终优化器优化后的效果可能也不一样。）</span></p>
  <ul list="u99c0a29a">
   <li fid="uc497b4c7" data-lake-id="u536a4412" id="u536a4412"><span data-lake-id="u9e160ee0" id="u9e160ee0">system：系统表，少量数据，往往不需要进行磁盘IO</span></li>
   <li fid="uc497b4c7" data-lake-id="ud9b1244c" id="ud9b1244c"><span data-lake-id="u3250add1" id="u3250add1">const：使用常数索引，MySQL 只会在查询时使用常数值进行匹配。</span></li>
  </ul>
  <ul list="u99c0a29a" data-lake-indent="1">
   <li fid="uc497b4c7" data-lake-id="u510eb33e" id="u510eb33e"><code data-lake-id="ua8fedefe" id="ua8fedefe"><span data-lake-id="uaa156617" id="uaa156617">explain select * from t2 where f='Hollis';</span></code></li>
   <li fid="uc497b4c7" data-lake-id="uf3eb91c1" id="uf3eb91c1"><span data-lake-id="u5b42e475" id="u5b42e475">使用唯一性索引做唯一查询</span></li>
  </ul>
  <ul list="u99c0a29a" start="3">
   <li fid="uc497b4c7" data-lake-id="u5013f11e" id="u5013f11e"><span data-lake-id="uac530b1d" id="uac530b1d">eq_ref：唯一索引扫描，只会扫描索引树中的一个匹配行。</span></li>
  </ul>
  <ul list="u99c0a29a" data-lake-indent="1">
   <li fid="uc497b4c7" data-lake-id="u55f54f63" id="u55f54f63"><code data-lake-id="u0c5a72b6" id="u0c5a72b6"><span data-lake-id="u92f22b7d" id="u92f22b7d">explain select * from t1 join t2 on t1.id = t2.id where t1.f1 = 's';</span></code><span data-lake-id="u247d147c" id="u247d147c"> </span></li>
   <li fid="uc497b4c7" data-lake-id="u05f3ce7f" id="u05f3ce7f"><span data-lake-id="u66d346dd" id="u66d346dd">当在连接操作中使用了唯一索引或主键索引，并且连接条件是基于这些索引的等值条件时，MySQL通常会选择 eq_ref 连接类型，以提高查询性能。</span></li>
  </ul>
  <ul list="u99c0a29a" start="4">
   <li fid="uc497b4c7" data-lake-id="u8967c4a8" id="u8967c4a8"><span data-lake-id="u90248d7b" id="u90248d7b">ref：非唯一索引扫描， 只会扫描索引树中的一部分来查找匹配的行。</span></li>
  </ul>
  <ul list="u99c0a29a" data-lake-indent="1">
   <li fid="uc497b4c7" data-lake-id="u5482092a" id="u5482092a"><code data-lake-id="u7b8564ed" id="u7b8564ed"><span data-lake-id="u38840f08" id="u38840f08">explain select * from t2 where a = 'Hollis';</span></code><span data-lake-id="ue5babf89" id="ue5babf89"> </span></li>
   <li fid="uc497b4c7" data-lake-id="u19c8bbbd" id="u19c8bbbd"><span data-lake-id="uc5cecaee" id="uc5cecaee">使用非唯一索引进行查询</span></li>
  </ul>
  <ul list="u99c0a29a" start="5">
   <li fid="uc497b4c7" data-lake-id="ueed599f7" id="ueed599f7"><span data-lake-id="u87f6c06b" id="u87f6c06b">range：范围扫描， 只会扫描索引树中的一个范围来查找匹配的行。</span></li>
  </ul>
  <ul list="u99c0a29a" data-lake-indent="1">
   <li fid="uc497b4c7" data-lake-id="ue45ef101" id="ue45ef101"><code data-lake-id="u2bbd0c6b" id="u2bbd0c6b"><span data-lake-id="uf9ec965b" id="uf9ec965b">explain select * from t2 where a &gt; 'a' and a &lt; 'c';</span></code></li>
   <li fid="uc497b4c7" data-lake-id="u464f008c" id="u464f008c"><span data-lake-id="ufa59e0ac" id="ufa59e0ac">使用索引进行性范围查询</span></li>
  </ul>
  <ul list="u99c0a29a" start="6">
   <li fid="uc497b4c7" data-lake-id="ud4e5e0bc" id="ud4e5e0bc"><span data-lake-id="ua139a3e5" id="ua139a3e5">index：全索引扫描， 会遍历索引树来查找匹配的行</span></li>
  </ul>
  <ul list="u99c0a29a" data-lake-indent="1">
   <li fid="uc497b4c7" data-lake-id="u5b3ff8ef" id="u5b3ff8ef"><code data-lake-id="u83751095" id="u83751095"><span data-lake-id="u0efed6a0" id="u0efed6a0">explain select c from t2 where b = 's';</span></code></li>
   <li fid="uc497b4c7" data-lake-id="ub8ccf1d4" id="ub8ccf1d4"><span data-lake-id="u750934c5" id="u750934c5">不符合最左前缀匹配的查询</span></li>
  </ul>
  <ul list="u99c0a29a" start="7">
   <li fid="uc497b4c7" data-lake-id="u1eb4496b" id="u1eb4496b"><span data-lake-id="u6de6447e" id="u6de6447e">ALL：全表扫描， 将遍历全表来找到匹配的行。</span></li>
  </ul>
  <ul list="u99c0a29a" data-lake-indent="1">
   <li fid="uc497b4c7" data-lake-id="u9fcc35c8" id="u9fcc35c8"><code data-lake-id="ubbedef9f" id="ubbedef9f"><span data-lake-id="u5b1395a4" id="u5b1395a4">explain select * from t2 where d = "ni";</span></code></li>
   <li fid="uc497b4c7" data-lake-id="ue1c0f3f9" id="ue1c0f3f9"><span data-lake-id="uec73a39d" id="uec73a39d">使用非索引字段查询</span></li>
  </ul>
  <p data-lake-id="ufac7cccd" id="ufac7cccd"><span data-lake-id="u1e0dbcb7" id="u1e0dbcb7"><br></span><span data-lake-id="uf8af1335" id="uf8af1335">需要注意的是，这里的index表示的是做了索引树扫描，效率并不高。以上类型由快到慢：</span></p>
  <p data-lake-id="u42412e13" id="u42412e13"><strong><span data-lake-id="ub5f61bec" id="ub5f61bec">system</span></strong><span data-lake-id="u8c8c8672" id="u8c8c8672">&gt; const &gt; eq_ref &gt;</span><strong><span data-lake-id="u00bd9bf9" id="u00bd9bf9">ref&gt;range&gt; index </span></strong><span data-lake-id="u7962b14a" id="u7962b14a">&gt;ALL</span></p>
  <p data-lake-id="u0063df8c" id="u0063df8c"><br></p>
  <p data-lake-id="u0717c0cb" id="u0717c0cb"><br></p>
  <p data-lake-id="uc40ccfdb" id="uc40ccfdb"><span data-lake-id="u53c671d5" id="u53c671d5">再来说说</span><strong><span data-lake-id="u7363e02f" id="u7363e02f">possible_keys 和 key</span></strong><span data-lake-id="udb743c32" id="udb743c32">，possible_keys 表示查询语句中可以使用的索引，而不一定实际使用了这些索引。这个字段列出了可能用于这个查询的所有索引，包括联合索引的组合。而 key 字段表示实际用于查询的索引。如果在查询中使用了索引，则该字段将显示使用的索引名称；</span></p>
  <p data-lake-id="u76fd1681" id="u76fd1681"><strong><span data-lake-id="u46ab65cd" id="u46ab65cd">​</span></strong><br></p>
  <p data-lake-id="ub14fe158" id="ub14fe158"><span data-lake-id="u4f36a3e6" id="u4f36a3e6">接着说一个</span><strong><span data-lake-id="u812f581d" id="u812f581d">很重要！</span></strong><span data-lake-id="uaac383fe" id="uaac383fe">的字段，但是经常被忽略的字段</span><strong><span data-lake-id="uafc9bf4e" id="uafc9bf4e">extra</span></strong><span data-lake-id="u3f01f0cb" id="u3f01f0cb">，这个字段描述了 MySQL 在执行查询时所做的一些附加操作。下面是 Extra 可能的取值及其含义：</span></p>
  <p data-lake-id="u1c1a4282" id="u1c1a4282"><span data-lake-id="ub40cdcae" id="ub40cdcae">​</span><br></p>
  <ul list="u508b4d6f">
   <li fid="u84d5027f" data-lake-id="u8bc59c03" id="u8bc59c03"><span data-lake-id="u24fe9d38" id="u24fe9d38">Using where：表示 MySQL 将在存储引擎检索行后，再进行条件过滤（使用 WHERE 子句）；查询的列未被索引覆盖，where筛选条件非索引的前导列或者</span><span data-lake-id="ub467fb99" id="ub467fb99" class="lake-fontsize-11" style="color: rgb(36, 41, 46)">where筛选条件非索引列。</span></li>
  </ul>
  <ul list="u508b4d6f" data-lake-indent="1">
   <li fid="u84d5027f" data-lake-id="u7fa3ba14" id="u7fa3ba14"><code data-lake-id="u351c9a92" id="u351c9a92"><span data-lake-id="uf6a7b472" id="uf6a7b472">explain select * from t2 where d = "ni";</span></code><span data-lake-id="uea92af99" id="uea92af99"> 非索引字段查询</span></li>
   <li fid="u84d5027f" data-lake-id="u178509fd" id="u178509fd"><code data-lake-id="u3b20b8b1" id="u3b20b8b1"><span data-lake-id="ue0e5cc37" id="ue0e5cc37">explain select d from t2 where b = "ni"; </span></code><span data-lake-id="u242bd3fa" id="u242bd3fa"> 未索引覆盖，用联合索引的非前导列查询</span></li>
  </ul>
  <ul list="u508b4d6f" start="2">
   <li fid="u84d5027f" data-lake-id="u047f66a9" id="u047f66a9"><span data-lake-id="ua281d65c" id="ua281d65c">Using index</span><span data-lake-id="u1cb0d090" id="u1cb0d090">：表示 MySQL 使用了覆盖索引（也称为索引覆盖）优化，只需要扫描索引，而无需回到数据表中检索行；</span></li>
  </ul>
  <ul list="u508b4d6f" data-lake-indent="1">
   <li fid="u84d5027f" data-lake-id="uf2116aa5" id="uf2116aa5"><code data-lake-id="u7264b822" id="u7264b822"><span data-lake-id="u215c5116" id="u215c5116">explain select b,c from t2 where a = "ni";</span></code><span data-lake-id="u957c70a8" id="u957c70a8"> 索引覆盖</span></li>
  </ul>
  <ul list="u508b4d6f" start="3">
   <li fid="u84d5027f" data-lake-id="uf4b51656" id="uf4b51656"><span data-lake-id="u12099a09" id="u12099a09">Using index condition：表示查询在索引上执行了部分条件过滤。这通常和索引下推有关。</span></li>
  </ul>
  <ul list="u508b4d6f" data-lake-indent="1">
   <li fid="u84d5027f" data-lake-id="u0ede7b08" id="u0ede7b08"><code data-lake-id="udf2d9674" id="udf2d9674"><span data-lake-id="ua746e5e8" id="ua746e5e8"> explain select d from t2 where a = "ni" and b like "s%";</span></code><span data-lake-id="u44477e6c" id="u44477e6c"> 使用到索引下推。</span></li>
  </ul>
  <ul list="u508b4d6f" start="4">
   <li fid="u84d5027f" data-lake-id="u5ee84c49" id="u5ee84c49"><span data-lake-id="u1931fe42" id="u1931fe42">Using where; Using index：查询的列被索引覆盖，并且where筛选条件是索引列之一，但不是索引的前导列，或者where筛选条件是索引列前导列的一个范围</span></li>
  </ul>
  <ul list="u508b4d6f" data-lake-indent="1">
   <li fid="u84d5027f" data-lake-id="u1f8a717c" id="u1f8a717c"><code data-lake-id="u5c711892" id="u5c711892"><span data-lake-id="u26301517" id="u26301517"> explain select a from t2 where b = "ni"; </span></code><span data-lake-id="u9b1996a3" id="u9b1996a3"> 索引覆盖，但是不符合最左前缀</span></li>
   <li fid="u84d5027f" data-lake-id="ue865b790" id="ue865b790"><code data-lake-id="u57bcce8b" id="u57bcce8b"><span data-lake-id="u1401acce" id="u1401acce">explain select b from t2 where a in ('a','d','sd'); </span></code><span data-lake-id="u8b5db26e" id="u8b5db26e"> 索引覆盖，但是前导列是个范围</span></li>
  </ul>
  <ul list="u508b4d6f" start="5">
   <li fid="u84d5027f" data-lake-id="u59e08634" id="u59e08634"><span data-lake-id="ub28f243f" id="ub28f243f">Using join buffer</span><span data-lake-id="ued60c8b5" id="ued60c8b5">：表示 MySQL 使用了连接缓存；</span></li>
  </ul>
  <ul list="u508b4d6f" data-lake-indent="1">
   <li fid="u84d5027f" data-lake-id="ue68307e3" id="ue68307e3"><code data-lake-id="u277f6788" id="u277f6788"><span data-lake-id="u34dfa7f2" id="u34dfa7f2"> explain select * from t1 join t2 on t1.id = t2.id where a = 's';</span></code></li>
  </ul>
  <ul list="u508b4d6f" start="6">
   <li fid="u84d5027f" data-lake-id="u2eac9638" id="u2eac9638"><span data-lake-id="uf2898773" id="uf2898773">Using temporary</span><span data-lake-id="uf0750ca6" id="uf0750ca6">：表示 MySQL 创建了临时表来存储查询结果。这通常是在排序或分组时发生的；</span></li>
  </ul>
  <ul list="u508b4d6f" data-lake-indent="1">
   <li fid="u84d5027f" data-lake-id="u140bc3b9" id="u140bc3b9"><code data-lake-id="uf39b486f" id="uf39b486f"><span data-lake-id="u33e23fd1" id="u33e23fd1"> explain select count(*),b from t2 group by b; </span></code></li>
  </ul>
  <ul list="u508b4d6f" start="7">
   <li fid="u84d5027f" data-lake-id="uf43d092e" id="uf43d092e"><span data-lake-id="u4aef4f5e" id="u4aef4f5e">Using filesort</span><span data-lake-id="ud82e4a72" id="ud82e4a72">：表示 MySQL 将使用文件排序而不是索引排序，这通常发生在无法使用索引来进行排序时；</span></li>
  </ul>
  <ul list="u508b4d6f" data-lake-indent="1">
   <li fid="u84d5027f" data-lake-id="u267448d5" id="u267448d5"><code data-lake-id="uf9d512c7" id="uf9d512c7"><span data-lake-id="ufaf6392d" id="ufaf6392d"> explain select count(*),b from t2 group by b; </span></code></li>
  </ul>
  <ul list="u508b4d6f" start="8">
   <li fid="u84d5027f" data-lake-id="ue60a7544" id="ue60a7544"><span data-lake-id="u3ec6a5c4" id="u3ec6a5c4">Using index for group-by：表示 MySQL 在分组操作中使用了索引。这通常是在分组操作涉及到索引中的所有列时发生的；</span></li>
   <li fid="u84d5027f" data-lake-id="u1fd35625" id="u1fd35625"><span data-lake-id="u94d67bbe" id="u94d67bbe">Using filesort for group-by</span><span data-lake-id="u5030761c" id="u5030761c">：表示 MySQL 在分组操作中使用了文件排序。这通常发生在无法使用索引进行分组操作时；</span></li>
   <li fid="u84d5027f" data-lake-id="u658ae54b" id="u658ae54b"><span data-lake-id="uc50b6278" id="uc50b6278">Range checked for each record</span><span data-lake-id="ucdcfab3a" id="ucdcfab3a">：表示 MySQL 在使用索引范围查找时，需要检查每一条记录；</span></li>
   <li fid="u84d5027f" data-lake-id="u467444f3" id="u467444f3"><span data-lake-id="u520d5bea" id="u520d5bea">Using index for order by</span><span data-lake-id="u8fe43c6a" id="u8fe43c6a">：表示 MySQL 在排序操作中使用了索引，这通常发生在排序涉及到索引中的所有列时；</span></li>
   <li fid="u84d5027f" data-lake-id="u59e6c016" id="u59e6c016"><span data-lake-id="u72aef2dc" id="u72aef2dc">Using filesort for order by</span><span data-lake-id="ud218b330" id="ud218b330">：表示 MySQL 在排序操作中使用了文件排序，这通常发生在无法使用索引进行排序时；</span></li>
   <li fid="u84d5027f" data-lake-id="ue43064af" id="ue43064af"><span data-lake-id="u1d3b2e57" id="u1d3b2e57">Using index for group-by; Using index for order by：表示 MySQL 在分组和排序操作中都使用了索引。</span></li>
  </ul>
  <p data-lake-id="ue5c0f8eb" id="ue5c0f8eb"><strong><span data-lake-id="ufab29350" id="ufab29350">​</span></strong><br></p>
  <h1 data-lake-id="JcB95" id="JcB95"><span data-lake-id="u700968c4" id="u700968c4">扩展知识</span></h1>
  <p data-lake-id="uccf65483" id="uccf65483"><br></p>
  <h2 data-lake-id="tIN9h" id="tIN9h"><span data-lake-id="udb58e3b3" id="udb58e3b3">如何判断一条SQL走没有索引</span></h2>
  <p data-lake-id="u0b6c7660" id="u0b6c7660"><br></p>
  <p data-lake-id="u36112eaf" id="u36112eaf"><span data-lake-id="ubb5f8240" id="ubb5f8240">首先看key字段有没有值，有值表示用到了索引树，但是具体是怎么用的，还得看type和extra。</span></p>
  <p data-lake-id="u457a963b" id="u457a963b"><span data-lake-id="ud5f42063" id="ud5f42063">​</span><br></p>
  <p data-lake-id="u09f4cec2" id="u09f4cec2"><span data-lake-id="u668685d3" id="u668685d3">简单说以下几个情况：</span></p>
  <p data-lake-id="u9cb7eedc" id="u9cb7eedc"><br></p>
  <p data-lake-id="u05b24059" id="u05b24059"><strong><span data-lake-id="ufa3181d4" id="ufa3181d4">情况一</span></strong><span data-lake-id="u09520b8c" id="u09520b8c">：</span></p>
  <p data-lake-id="u99947d90" id="u99947d90"><span data-lake-id="u28201bdb" id="u28201bdb">​</span><br></p>
  <p data-lake-id="ucff8b85a" id="ucff8b85a"><code data-lake-id="u7ae7a874" id="u7ae7a874"><span data-lake-id="ud0b96a3a" id="ud0b96a3a">explain select b from t2 where a in ('a','d','sd');</span></code></p>
  <p data-lake-id="ua849b353" id="ua849b353"><span data-lake-id="u39a4b65b" id="u39a4b65b">​</span><br></p>
  <pre lang="java"><code>
+----+-------+---------------+----------+--------------------------+                                           
| id | type  | possible_keys | key      | Extra                    |                                           
+----+-------+---------------+----------+--------------------------+                                           
|  1 | index | NULL          | idx_abc | Using where; Using index |                                           
+----+-------+---------------+----------+--------------------------+ 
</code></pre>
  <p data-lake-id="ufaedcfd0" id="ufaedcfd0"><span data-lake-id="u3f3479c3" id="u3f3479c3">​</span><br></p>
  <p data-lake-id="u8107465e" id="u8107465e"><span data-lake-id="u3c205ef9" id="u3c205ef9">type = index ， key = idx_abc ，extra = Using where; Using index ，表示本次查询用到了idx_abc的联合索引，但是没有遵守最左前缀匹配，或者遵守了最左前缀，但是使用了a字段进行了范围查询。所以，</span><strong><span data-lake-id="u412ec271" id="u412ec271">最终其实还是扫描了索引树的。效率并不高</span></strong></p>
  <p data-lake-id="u6c93cac6" id="u6c93cac6"><strong><span data-lake-id="u93e71387" id="u93e71387">​</span></strong><br></p>
  <p data-lake-id="u985d98ce" id="u985d98ce"><strong><span data-lake-id="u43adf685" id="u43adf685">情况二：</span></strong></p>
  <p data-lake-id="ue0ecb2b6" id="ue0ecb2b6"><strong><span data-lake-id="u9d0dccd4" id="u9d0dccd4">​</span></strong><br></p>
  <p data-lake-id="u6dc22287" id="u6dc22287"><code data-lake-id="u76f9eec6" id="u76f9eec6"><span data-lake-id="ud423e782" id="ud423e782"> explain select * from t2 where a = 'Hollis';</span></code></p>
  <p data-lake-id="ud9034b90" id="ud9034b90"><strong><span data-lake-id="u7736f27d" id="u7736f27d">​</span></strong><br></p>
  <pre lang="java"><code>
+----+-------+---------------+----------+--------------------------+                                           
| id | type  | possible_keys | key      | Extra                    |                                           
+----+-------+---------------+----------+--------------------------+                                           
|  1 | ref   | idx_abc      | idx_abc | NULL                     |                                           
+----+-------+---------------+----------+--------------------------+ 
</code></pre>
  <p data-lake-id="u28197905" id="u28197905"><span data-lake-id="u7d3e8562" id="u7d3e8562">​</span><br></p>
  <p data-lake-id="u659aebac" id="u659aebac"><span data-lake-id="u7557e163" id="u7557e163">表示用到了索引进行查询，并且用到的是idx_abc这个非唯一索引。</span></p>
  <p data-lake-id="u38bef3f6" id="u38bef3f6"><span data-lake-id="u9ef7f6bf" id="u9ef7f6bf">​</span><br></p>
  <p data-lake-id="u8bfcd3e2" id="u8bfcd3e2"><strong><span data-lake-id="uaf5aa70e" id="uaf5aa70e">情况三：</span></strong></p>
  <p data-lake-id="u1674b8be" id="u1674b8be"><span data-lake-id="ua4c1cb1e" id="ua4c1cb1e">​</span><br></p>
  <p data-lake-id="u00b5b54d" id="u00b5b54d"><code data-lake-id="u94f5d4fe" id="u94f5d4fe"><span data-lake-id="uc168926f" id="uc168926f"> explain select * from t2 where f = 'f';</span></code></p>
  <p data-lake-id="u8a920e1a" id="u8a920e1a"><span data-lake-id="u0511847b" id="u0511847b">​</span><br></p>
  <pre lang="java"><code>
+----+-------+---------------+----------+--------------------------+                                           
| id | type  | possible_keys | key      | Extra                    |                                           
+----+-------+---------------+----------+--------------------------+                                           
|  1 | const | f             | f        | NULL                     |                                           
+----+-------+---------------+----------+--------------------------+ 
</code></pre>
  <p data-lake-id="uc53f18c3" id="uc53f18c3"><span data-lake-id="uc25a9db0" id="uc25a9db0">​</span><br></p>
  <p data-lake-id="u0e2ee226" id="u0e2ee226"><span data-lake-id="u6229ecb1" id="u6229ecb1">表示用到了索引进行查询，并且用到的是f这个唯一索引。</span></p>
  <p data-lake-id="u2e51b814" id="u2e51b814"><span data-lake-id="uf415d51e" id="uf415d51e">​</span><br></p>
  <p data-lake-id="ub26b1514" id="ub26b1514"><strong><span data-lake-id="u3a3bd585" id="u3a3bd585">情况四</span></strong><span data-lake-id="ufcc96e5c" id="ufcc96e5c">：</span></p>
  <p data-lake-id="u006c8342" id="u006c8342"><span data-lake-id="u2b2fd229" id="u2b2fd229">​</span><br></p>
  <p data-lake-id="ue11019b7" id="ue11019b7"><code data-lake-id="u90a6d20d" id="u90a6d20d"><span data-lake-id="ub6043c6a" id="ub6043c6a">explain select b,c from t2 where a = 'Hollis';</span></code></p>
  <p data-lake-id="u85366aad" id="u85366aad"><span data-lake-id="u70191ddf" id="u70191ddf">​</span><br></p>
  <pre lang="java"><code>
+----+-------+---------------+----------+--------------------------+                                           
| id | type  | possible_keys | key      | Extra                    |                                           
+----+-------+---------------+----------+--------------------------+                                           
|  1 | ref   | idx_abc      | idx_abc |  Using index             |                                           
+----+-------+---------------+----------+--------------------------+ 
</code></pre>
  <p data-lake-id="uc534d687" id="uc534d687"><span data-lake-id="u4e6441d2" id="u4e6441d2">​</span><br></p>
  <p data-lake-id="u45f565cc" id="u45f565cc"><span data-lake-id="ubfa60c34" id="ubfa60c34">表示用到了索引进行查询，并且用到了idx_abc这个索引，而且查询用到了覆盖索引，不需要回表。</span></p>
  <p data-lake-id="u7703c7c9" id="u7703c7c9"><span data-lake-id="ud5e89229" id="ud5e89229">​</span><br></p>
  <p data-lake-id="u6adb3dbc" id="u6adb3dbc"><strong><span data-lake-id="u223c28c6" id="u223c28c6">情况五</span></strong><span data-lake-id="u9a98d201" id="u9a98d201">：</span></p>
  <p data-lake-id="u50c71ab5" id="u50c71ab5"><span data-lake-id="u9dddcfa4" id="u9dddcfa4">​</span><br></p>
  <p data-lake-id="u58447444" id="u58447444"><code data-lake-id="u65f7d07e" id="u65f7d07e"><span data-lake-id="u7059eb67" id="u7059eb67">explain select b,c from t2 where d = 'Hollis';</span></code></p>
  <p data-lake-id="u5e925e12" id="u5e925e12"><span data-lake-id="ubf2d62a3" id="ubf2d62a3">​</span><br></p>
  <pre lang="java"><code>
+----+-------+---------------+----------+--------------------------+                                           
| id | type  | possible_keys | key      | Extra                    |                                           
+----+-------+---------------+----------+--------------------------+                                           
|  1 | ALL   | NULL          | NULL     |  Using where             |                                           
+----+-------+---------------+----------+--------------------------+ 
</code></pre>
  <p data-lake-id="u04676c1c" id="u04676c1c"><br></p>
  <p data-lake-id="u99bde3b3" id="u99bde3b3"><span data-lake-id="u20f31e72" id="u20f31e72">表示没有用到索引。</span></p>
 </body>
</html>